package com.xzcedu.tankgame5;

import java.util.Vector;

/**
 * @author 徐州城
 * @version 1.0
 * 请在XzcTankGame02.java基础上画出三辆坦克，注意颜色
 * <p>
 * 敌人的坦克
 * 分析：
 * 1. 因为敌人的坦克，是在MyPanel上，所以我们的代码在MyPanel
 * 2. 因为敌人的坦克，后面有自己特殊的属性和方法，可以单开一个EnemyTank
 * 3. 敌人的坦克数量多，可以放入到集合 Vector，因为考虑多线程问题
 */
public class EnemyTank extends Tank implements Runnable {
    //在敌人坦克类，使用Vector 保存多个Shot
    Vector<Shot> shots = new Vector<>();
    //增加成员，EnemyTank 可以得到敌人坦克的Vector
    //分析
    //1. Vector<EnemyTank> 在
    Vector<EnemyTank> enemyTanks = new Vector<>();
    boolean isLive = true;

    public EnemyTank(int x, int y) {
        super(x, y);
    }

    //这里提供一个方法 可以将MyPanel 对象的Vector<EnemyTank> enemyTanks = new Vector<>();
    //设置到EnemyTank 的成员 enemyTanks
    public void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
        this.enemyTanks = enemyTanks;
    }

    //编写方法，判断当前这个敌人坦克，是否和 enemyTanks 中的坦克和其他坦克发生了重叠或者是碰撞
    public boolean isTouchTank() { //是否碰到了坦克

        //判断当前敌人坦克(this) 方向
        switch (this.getDirect()) {
            case 0://上
                //让this这个坦克和其它坦克比较
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //从vector 取出一个敌人的坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不能和自己比较
                    if (enemyTank != this){
                        //如果敌人坦克是上/下
                        //分析
                        //1. 如果敌人坦克是上/下 必须确定 x的范围 [enemyTank.getX(), enemyTank.getX() + 40]
                        //                           y的范围 [enemyTank.getY(), enemyTank.getY() + 60]
                        //   敌人坦克的范围就是 [enemyTank.getX(), enemyTank.getY()] ~ [enemyTank.getX() + 40, enemyTank.getY() + 60] 这个范围区间内
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2){
                            //2. 当前坦克 左上角坐标 [this.getX(), this.getY()]
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 60) {
                                return true;//当这个条件满足时 说明已经坦克的左上角 发生碰撞了/进入到敌方坦克内了
                            }

                            //3. 当前坦克 右上角坐标 [this.getX() + 40, this.getY()]
                            if (this.getX() + 40 >= enemyTank.getX() && this.getX() + 40 <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 60){
                                return true;//当这个条件满足时 说明已经坦克的右上角发生碰撞了
                            }
                        }
                        //如果敌人坦克是右/左
                        //分析
                        //1. 如果敌人坦克是左/右 必须确定 x的范围 [enemyTank.getX(), enemyTank.getX() + 60]
                        //                           y的范围 [enemyTank.getY(), enemyTank.getY() + 40]
                        //   敌人坦克的范围就是 [enemyTank.getX(), enemyTank.getY()] ~ [enemyTank.getX() + 60, enemyTank.getY() + 40] 这个范围区间内
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3){
                            //2. 当前坦克 左上角坐标 [this.getX(), this.getY()]
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 40) {
                                return true;//当这个条件满足时 说明已经坦克的左上角 发生碰撞了/进入到敌方坦克内了
                            }

                            //3. 当前坦克 右上角坐标 [this.getX() + 40, this.getY()]
                            if (this.getX() + 40 >= enemyTank.getX() && this.getX() + 40 <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 40) {
                                return true;//当这个条件满足时 说明已经坦克的右上角发生碰撞了
                            }
                        }
                    }
                }
                break;
            case 1://右
                //让其他所有敌人坦克和其它坦克比较
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //从vector 取出一个敌人的坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不能和自己比较
                    if (enemyTank != this){
                        //如果敌人坦克是上/下
                        //分析
                        //1. 如果敌人坦克是上/下 必须确定 x的范围 [enemyTank.getX(), enemyTank.getX() + 40]
                        //                           y的范围 [enemyTank.getY(), enemyTank.getY() + 60]
                        //   敌人坦克的范围就是 [enemyTank.getX(), enemyTank.getY()] ~ [enemyTank.getX() + 40, enemyTank.getY() + 60] 这个范围区间内
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2){
                            //2. 当前坦克 右上角坐标 [this.getX() + 60, this.getY()]
                            if (this.getX() + 60 >= enemyTank.getX() && this.getX() + 60 <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 60) {
                                return true;//当这个条件满足时 说明已经坦克的右上角 发生碰撞了/进入到敌方坦克内了
                            }

                            //3. 当前坦克 右下角坐标 [this.getX() + 60, this.getY() + 40]
                            if (this.getX() + 60 >= enemyTank.getX() && this.getX() + 60 <= enemyTank.getX() + 40
                                    && this.getY() + 40 >= enemyTank.getY() && this.getY() + 40 <= enemyTank.getY() + 60){
                                return true;//当这个条件满足时 说明已经坦克的右下角发生碰撞了
                            }
                        }
                        //如果敌人坦克是右/左
                        //分析
                        //1. 如果敌人坦克是左/右 必须确定 x的范围 [enemyTank.getX(), enemyTank.getX() + 60]
                        //                           y的范围 [enemyTank.getY(), enemyTank.getY() + 40]
                        //   敌人坦克的范围就是 [enemyTank.getX(), enemyTank.getY()] ~ [enemyTank.getX() + 60, enemyTank.getY() + 40] 这个范围区间内
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3){
                            //2. 当前坦克 右上角坐标 [this.getX() + 60, this.getY()]
                            if (this.getX() + 60 >= enemyTank.getX() && this.getX() + 60 <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 40) {
                                return true;//当这个条件满足时 说明已经坦克的右上角 发生碰撞了/进入到敌方坦克内了
                            }

                            //3. 当前坦克 右下角坐标 [this.getX() + 60, this.getY() + 40]
                            if (this.getX() + 60 >= enemyTank.getX() && this.getX() + 60 <= enemyTank.getX() + 60
                                    && this.getY() + 40 >= enemyTank.getY() && this.getY() + 40 <= enemyTank.getY() + 40) {
                                return true;//当这个条件满足时 说明已经坦克的右下角发生碰撞了
                            }
                        }
                    }
                }
                break;
            case 2://下
                //让其他所有敌人坦克和其它坦克比较
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //从vector 取出一个敌人的坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不能和自己比较
                    if (enemyTank != this){
                        //如果敌人坦克是上/下
                        //分析
                        //1. 如果敌人坦克是上/下 必须确定 x的范围 [enemyTank.getX(), enemyTank.getX() + 40]
                        //                           y的范围 [enemyTank.getY(), enemyTank.getY() + 60]
                        //   敌人坦克的范围就是 [enemyTank.getX(), enemyTank.getY()] ~ [enemyTank.getX() + 40, enemyTank.getY() + 60] 这个范围区间内
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2){
                            //2. 当前坦克 左下角坐标 [this.getX(), this.getY() + 60]
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() + 60 >= enemyTank.getY() && this.getY() + 60 <= enemyTank.getY() + 60) {
                                return true;//当这个条件满足时 说明已经坦克的左下角 发生碰撞了/进入到敌方坦克内了
                            }

                            //3. 当前坦克 右下角坐标 [this.getX() + 40, this.getY() + 60]
                            if (this.getX() + 40 >= enemyTank.getX() && this.getX() + 40 <= enemyTank.getX() + 40
                                    && this.getY() + 60 >= enemyTank.getY() && this.getY() + 60 <= enemyTank.getY() + 60){
                                return true;//当这个条件满足时 说明已经坦克的右下角发生碰撞了
                            }
                        }
                        //如果敌人坦克是右/左
                        //分析
                        //1. 如果敌人坦克是左/右 必须确定 x的范围 [enemyTank.getX(), enemyTank.getX() + 60]
                        //                           y的范围 [enemyTank.getY(), enemyTank.getY() + 40]
                        //   敌人坦克的范围就是 [enemyTank.getX(), enemyTank.getY()] ~ [enemyTank.getX() + 60, enemyTank.getY() + 40] 这个范围区间内
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3){
                            //2. 当前坦克 左下角坐标 [this.getX(), this.getY() + 60]
                            if (this.getX()  >= enemyTank.getX() && this.getX()  <= enemyTank.getX() + 60
                                    && this.getY() + 60 >= enemyTank.getY() && this.getY() + 60 <= enemyTank.getY() + 40) {
                                return true;//当这个条件满足时 说明已经坦克的左上角 发生碰撞了/进入到敌方坦克内了
                            }

                            //3. 当前坦克 右下角坐标 [this.getX() + 40, this.getY() + 60]
                            if (this.getX() + 40 >= enemyTank.getX() && this.getX() + 40 <= enemyTank.getX() + 60
                                    && this.getY() + 60 >= enemyTank.getY() && this.getY() + 60 <= enemyTank.getY() + 40) {
                                return true;//当这个条件满足时 说明已经坦克的右上角发生碰撞了
                            }
                        }
                    }
                }
                break;
            case 3://左
                //让其他所有敌人坦克和其它坦克比较
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //从vector 取出一个敌人的坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不能和自己比较
                    if (enemyTank != this){
                        //如果敌人坦克是上/下
                        //分析
                        //1. 如果敌人坦克是上/下 必须确定 x的范围 [enemyTank.getX(), enemyTank.getX() + 40]
                        //                           y的范围 [enemyTank.getY(), enemyTank.getY() + 60]
                        //   敌人坦克的范围就是 [enemyTank.getX(), enemyTank.getY()] ~ [enemyTank.getX() + 40, enemyTank.getY() + 60] 这个范围区间内
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2){
                            //2. 当前坦克 左上角坐标 [this.getX(), this.getY()]
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 60) {
                                return true;//当这个条件满足时 说明已经坦克的左上角 发生碰撞了/进入到敌方坦克内了
                            }

                            //3. 当前坦克 左下角坐标 [this.getX(), this.getY() + 40]
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() + 40 >= enemyTank.getY() && this.getY() + 40 <= enemyTank.getY() + 60){
                                return true;//当这个条件满足时 说明已经坦克的左下角发生碰撞了
                            }
                        }
                        //如果敌人坦克是右/左
                        //分析
                        //1. 如果敌人坦克是左/右 必须确定 x的范围 [enemyTank.getX(), enemyTank.getX() + 60]
                        //                           y的范围 [enemyTank.getY(), enemyTank.getY() + 40]
                        //   敌人坦克的范围就是 [enemyTank.getX(), enemyTank.getY()] ~ [enemyTank.getX() + 60, enemyTank.getY() + 40] 这个范围区间内
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3){
                            //2. 当前坦克 左上角坐标 [this.getX(), this.getY()]
                            if (this.getX()  >= enemyTank.getX() && this.getX()  <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 40) {
                                return true;//当这个条件满足时 说明已经坦克的左上角 发生碰撞了/进入到敌方坦克内了
                            }

                            //3. 当前坦克 左下角坐标 [this.getX(), this.getY() + 40]
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() + 40 >= enemyTank.getY() && this.getY() + 40 <= enemyTank.getY() + 40) {
                                return true;//当这个条件满足时 说明已经坦克的右上角发生碰撞了
                            }
                        }
                    }
                }
                break;
        }
        return false;//执行到这里说明没有发生碰撞
    }

    @Override
    public void run() {

        while (isLive) {

            //这里我们判断如果 shots size() = 0，创建一颗子弹，放入到
            //shots集合里 并且 坦克当前是存活的，并启动
            if (isLive && shots.size() < 3) {
                Shot s = null;

                //判断坦克的方向，创建对应的子弹
                switch (super.getDirect()) {
                    case 0:
                        s = new Shot(getX() + 20, getY(), 0);
                        break;
                    case 1:
                        s = new Shot(getX() + 60, getY() + 20, 1);
                        break;
                    case 2:
                        s = new Shot(getX() + 20, getY() + 60, 2);
                        break;
                    case 3:
                        s = new Shot(getX(), getY() + 20, 3);
                        break;
                }
                //每隔10秒
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                shots.add(s);
                //启动线程
                new Thread(s).start();
            }


            //产生一个 30 ~ 40 的随机数 方便对坦克移动
            int random = (int) (Math.random() * 11) + 30;

            //根据坦克的方向来进行移动
            switch (getDirect()) {
                case 0://向上
                    for (int i = 0; i < random; i++) {
                        //当 当前坦克坐标大于0
                        if (getY() > 0 ) {//表示坦克向上移动的区域
                            if (!isTouchTank()) {//并没有和别的坦克重叠时 最终才能移动
                                super.moveUp();
                            } else
                                //当此if条件为 false时 就代表 isTouchTank==true 所以坦克已经有重叠现象了 为了防止两个坦克卡在一起 直接break 进行下一次循环
                                break;
                        } else
                            //表示 如果当if 条件为false时 就代表 当前坦克已经到达了边界 为了防止卡在边界不动，直接break 进入下一次移动判断
                            break;

                        //休眠50豪秒
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 1://向右
                    for (int i = 0; i < random; i++) {
                        if (getX() + 60 < 1000) {
                            if (!isTouchTank()) {
                                super.moveRight();
                            }
                        } else
                            break;

                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 2://向下
                    for (int i = 0; i < random; i++) {
                        if (getY() + 60 < 750) {
                            if (!isTouchTank()) {
                                super.moveDown();
                            }
                        } else
                            break;

                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 3://向左
                    for (int i = 0; i < random; i++) {
                        if (getX() > 0) {
                            if (!isTouchTank()) {
                                super.moveLeft();
                            }
                        } else
                            break;

                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
            }

            //随机的改变坦克方向 0 ~ 3
            setDirect((int) (Math.random() * 4));

            //听老韩说，写并发程序，一定要考虑清楚，该线程什么时候结束
//            if (!isLive) {
//                break;//退出线程
//            }
        }

    }
}
